package com.tjetc._2map;

import java.util.Comparator;
import java.util.Objects;
import java.util.TreeMap;
import java.util.TreeSet;

@SuppressWarnings("all")
public class _5TreeMap {
    public static void main(String[] args) {
        /*
        1. 在第一次初始化的时候，会将传入的比较器进行赋值操作
                parent = t;
                // 会根据自己实现的comparator的compareTo方法进行比较
                cmp = k.compareTo(t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else {
                    V oldValue = t.value;
                    if (replaceOld || oldValue == null) {
                        t.value = value;
                    }
                    return oldValue;
                }
         */
        // 第一种 按照你传进对象 compareTo方法进行排序
        TreeMap treeMap = new TreeMap();
//        treeMap.put("3", 1);
//        treeMap.put("2", 2);
//        treeMap.put("7", 3);
//        treeMap.put("6", 3);
//        treeMap.put("9", 3);
//        treeMap.put("1", 3);
//        System.out.println(treeMap);
        System.out.println("-------------------");
        // 为什么？
        // TreeMap的key必须实现比较器接口 否则报错
        //treeMap.put(new B(), null);
        treeMap.put(new A(3), null);
        treeMap.put(new A(1), null);
        treeMap.put(new A(2), null);
        System.out.println(treeMap);

        // 第二种 根据自己提供的比较器进行排序
        // 根据String的长度进行排序
        TreeMap treeMap1 = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o1).length() - ((String)o2).length();
            }
        });

        treeMap1.put("a", null);
        treeMap1.put("abc", null);
        treeMap1.put("aeaq", null);
        // 在添加的过程中如果，根据比较器得出的结果=0 就认为是重复数据，直接不添加
        treeMap1.put("b", null);
        treeMap1.put("asdfsdfsdf", null);
        treeMap1.put("asdfsdfds", null);
        System.out.println(treeMap1);

    }
}

class B {

}



class A implements Comparable {
    private int n;

    public A(int n) {
        this.n = n;
    }

    @Override
    public int compareTo(Object o) {
        // 比较规则会影响去重
        A a = (A) o;
        return this.n - a.n;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        A a = (A) o;
        return n == a.n;
    }

    @Override
    public int hashCode() {
        return Objects.hash(n);
    }

    @Override
    public String toString() {
        return "A{" +
                "n=" + n +
                '}';
    }
}
